package com.dospyer.consumer.service.impl;

import com.dospyer.provider.api.User;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@Service
public class RestTemplateService {

    /**
     * 1. RestTemplateConfiguration 中实例化 RestTemplate 时，增加 @LoadBalanced 注解
     * 2. LoadBalancerAutoConfiguration 执行时获取到所有加了 @LoadBalanced 注解的 RestTemplate，通过 RestTemplateCustomizer 进行定制化处理（增加拦截器）
     * 3. RestTemplate 调用时会进入到 LoadBalancerInterceptor 的 intercept 方法，在 intercept 方法中通过 loadBalancer.execute（RibbonLoadBalancerClient#execute） 完成网络请求
     * 4. 最终在 LoadBalancerRequestFactory 中封装好 ServiceRequestWrapper，并通过 InterceptingClientHttpRequest.InterceptingRequestExecution 发送真正的网络请求。（InterceptingClientHttpRequest.InterceptingRequestExecution 在 spring-web module 中）
     *      ServiceRequestWrapper 通过实现父类的 getURI 方法，完成请求 url 的替换
     */
    @Resource
    private RestTemplate restTemplate;

    public String sayHello(Long id, String name, Integer age) {
        // http://192.168.31.107:8080/sayHello/leo
        Map<String, String> param = new HashMap<>();
        param.put("name", name);
        param.put("age", String.valueOf(age));
        return restTemplate.getForObject("http://provider/sayHello/" + id + "?name={name}&age={age}", String.class, param);
    }

    public String createUser(User user) {
        ResponseEntity<String> response = restTemplate.postForEntity("http://provider/", user, String.class);
        return response.getBody();
    }
}
